﻿using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.Servicos.Utilitarios;
using System.Security.Cryptography;

namespace LM.Servicos
{
    public class ServicoDeOperador : IServicoDeOperador
    {
        private IRepositorioDeOperador _repositorio;

        private ValidadorDeOperador _validador;

        public ServicoDeOperador() 
        {
            _repositorio = FabricaDeRepositorios.Crie<IRepositorioDeOperador>();
            _validador = new ValidadorDeOperador(_repositorio);
        }

        public void Cadastre(DtoOperador dtoOperador)
        {
            var operador = ConversorDeObjetos.Copie<Operador>(dtoOperador);

            _validador.ValideCadastro(operador);

            using (var md5 = MD5.Create())
            {
                operador.Senha = Chrypher.GetMd5Hash(md5, operador.Senha);
            }

            _repositorio.Cadastre(operador);
        }

        public void Atualize(DtoOperador dtoOperador)
        {
            var operador = ConversorDeObjetos.Copie<Operador>(dtoOperador);

            _validador.ValideAtualizacao(operador);

            using (var md5 = MD5.Create())
            {
                operador.Senha = Chrypher.GetMd5Hash(md5, operador.Senha);
            }

            _repositorio.Atualize(operador);
        }

        public void Exclua(int codigo)
        {
            var operador = ConversorDeObjetos.Copie<Operador>(_repositorio.Consulte(codigo));

            _validador.ValideExclusao(operador);

            _repositorio.Exclua(operador);
        }

        public DtoOperador Consulte(int codigo)
        {
            var operador = _repositorio.Consulte(codigo);

            return ConversorDeObjetos.Copie<DtoOperador>(operador);
        }

        public IList<DtoOperador> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoOperador, Operador>(_repositorio.ConsulteTodos());
        }

        public bool Autentique(DtoOperador operador)
        {
            var op = ConversorDeObjetos.Copie<Operador>(operador);
            return _repositorio.Consulte(op);
        }
    }
}
